//
//  NSString+DSHex.m
//  KX11UI
//
//  Created by HYC on 2021/2/19.
//

#import "NSString+HYC_Tools.h"

@implementation NSString (HYC_Tools)


- (UIColor *)H_color {
    
    NSString *cString = self;//[[color stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]] uppercaseString];
    // String should be 6 or 8 characters
    if ([cString length] < 6)
    {
        return [UIColor clearColor];
    }
    // strip 0X if it appears
    //如果是0x开头的，那么截取字符串，字符串从索引为2的位置开始，一直到末尾
    if ([cString hasPrefix:@"0X"])
    {
        cString = [cString substringFromIndex:2];
    }
    //如果是#开头的，那么截取字符串，字符串从索引为1的位置开始，一直到末尾
    if ([cString hasPrefix:@"#"])
    {
        cString = [cString substringFromIndex:1];
    }
    if ([cString length] != 6)
    {
        return [UIColor clearColor];
    }
    
    // Separate into r, g, b substrings
    NSRange range;
    range.location = 0;
    range.length = 2;
    //r
    NSString *rString = [cString substringWithRange:range];
    //g
    range.location = 2;
    NSString *gString = [cString substringWithRange:range];
    //b
    range.location = 4;
    NSString *bString = [cString substringWithRange:range];
    
    // Scan values
    unsigned int r, g, b;
    [[NSScanner scannerWithString:rString] scanHexInt:&r];
    [[NSScanner scannerWithString:gString] scanHexInt:&g];
    [[NSScanner scannerWithString:bString] scanHexInt:&b];
    return [UIColor colorWithRed:((float)r / 255.0f) green:((float)g / 255.0f) blue:((float)b / 255.0f) alpha:1];
}
- (UIImage *)H_image {

    return [UIImage imageNamed:self];
    
//    NSString *imgName = [NSString stringWithFormat:self];
//
//    return vehicleApp(imgName);
    
}
- (UIFont *)H_font {
    return [UIFont systemFontOfSize:self.floatValue];
}
- (UIFont *)H_weight:(UIFontWeight)we {
    return [UIFont systemFontOfSize:self.floatValue weight:we];
}
- (NSString *)H_time_Inter_ToStr:(NSTimeInterval )date{
    NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
    
    //zzz表示时区，zzz可以删除，这样返回的日期字符将不包含时区信息。
    [dateFormatter setDateFormat:self];
//    double d            = date;
    NSDecimalNumber *dStr      = [[NSDecimalNumber alloc]initWithFloat:date];
    
    return [dateFormatter stringFromDate:[NSDate dateWithTimeIntervalSince1970:dStr.stringValue.length == 13 ? (date) / 1000 : (date)]];

}
- (NSTimeInterval )H_time_Str_ToInter:(NSString *)date{
    NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
    
    //zzz表示时区，zzz可以删除，这样返回的日期字符将不包含时区信息。
    [dateFormatter setDateFormat:self];
//    double d            = date;
//    NSString *dStr      = [NSString stringWithFormat:@"%f", d];

    
    return ([[dateFormatter dateFromString:date] timeIntervalSince1970] * 1000);

}
- (id _Nullable)H_READ_FILE {
    
    NSArray *temp = [self componentsSeparatedByString:@"."];
    
    if (temp.count == 2) return [NSJSONSerialization JSONObjectWithData:[[NSString stringWithContentsOfFile:[[NSBundle mainBundle] pathForResource:temp.firstObject ofType:temp.lastObject] encoding:NSUTF8StringEncoding error:nil] dataUsingEncoding:NSUTF8StringEncoding] options:NSJSONReadingMutableContainers error:nil];

    else return nil;
    
    
}
- (NSURL *)H_urlImage {
    return [NSURL URLWithString:self];
}
- (void)H_Call {
    NSMutableString* str = [[NSMutableString alloc]initWithFormat:@"telprompt://%@",self];
    [[UIApplication sharedApplication] openURL:[NSURL URLWithString:str] options:@{} completionHandler:nil];
}


/// 错误码转换
- (NSString *)Error_description {
    return [self Error_description:nil WithReplacement:nil];
}

/// 如果错误码中没有code对应的情况下返回的错误信息
- (NSString *)Error_description:(NSString *)Other {

    return [self Error_description:Other WithReplacement:nil];
}


/// 错误码表替换和增加
/// @param Other 如果错误码中没有code对应的情况下返回的错误信息
/// @param dict 增加或者需要修改错误信息
- (NSString *)Error_description:(NSString *)Other WithReplacement:(NSDictionary *)dict {
    
    
    
    NSDictionary *errorDic = @{

    @"1400": @"请求参数错误",
    @"1402": @"请求没有权限",
    @"1405": @"请求资源不存在",
    @"1500": @"系统内部错误",
    @"1501": @"数字钥匙不存在",// 0212邮件里没有
    @"1600": @"车辆数字钥匙未激活，请激活",
    @"1601": @"人车关系不存在",
    @"1604": @"第三方交互异常",
    @"1605": @"根据vin查询车辆详情数据返回异常",
    @"1606": @"车辆数字钥匙禁止此操作,设备ID不一致",
    @"1607": @"指令执行失败,车辆不在线或其他情况!",
    @"1800": @"Call Grpc error",
    @"1801": @"服务调用异常",//add ::0212邮件
    @"2000": @"下发钥匙失败",
    @"2001": @"Call Grpc error",
    @"2002": @"请求数据不存在",//modify:0212邮件 old:"数据库操作异常"
    @"2003": @"数字钥匙已存在",
    @"2004": @"分享数字钥匙已存在",
    @"2005": @"数字钥匙不存在",
    @"2006": @"车辆钥匙未同步",
    @"2007": @"车辆钥匙已同步",
    @"2008": @"认证钥匙更新信息失败",
    @"2009": @"认证钥匙失败",
    @"2010": @"删除车辆钥匙失败",
    @"2011": @"钥匙同步失败",
    @"2012": @"超过最大分享次数",//与邮件不一致，0218版本与安卓统一不显示次10次
    @"2013": @"分享类型错误",
    @"2014": @"设备来源类型错误只能为[1、3]其中值",
    @"2015": @"分享次数[1-10] 之间",
    @"2016": @"钥匙信息不匹配",
    @"2017": @"车主设备来源范围[1、2、3、4、5]其中值",
    @"2018": @"设备信息错误",
    @"2019": @"NFC CARD 或NFC WATCH数量超限",
    @"2020": @"手表钥匙只能分享一次",
    @"2021": @"手机NFC钥匙只能分享一次",
    @"2022": @"数字钥匙已过期",
    @"2023": @"booking.client初始化失败",
    @"2024": @"secure.client初始化失败",
    @"2025": @"蓝牙、手表、nfc 只能有一把车主钥匙",
    @"2026": @"设备id一致无需认证",
    @"2027": @"调用NFC服务异常",
    @"2028": @"分享类型不符合要求",
    @"2029": @"非蓝牙钥匙无需认证",
    @"2030": @"设备Id不存在",
    @"2031": @"车辆vin码不存在",
    @"2032": @"CmacKey 不存在",
    @"2033": @"超过最大分享次数且只能为5把",
    @"2034": @"NFC数据验签失败",
    @"2035": @"获取车辆钥匙失败",
    @"2036": @"数字钥匙绑定身份不一致",//add ::0212邮件
    @"3000": @"钥匙同步失败",
    @"3001": @"请先配置VDS 版本",
    @"3002": @"call Grpc error",
    @"3003": @"Needn't send because powerMode 2 is not allow",
    @"3004": @"Needn't send because powerMode 3 is not allow",
    @"3005": @"Needn't send because powerMode 1 is not allow",
    @"3006": @"secure.client初始化失败",
    @"3007": @"调用加密cemdk.error",
    @"3008": @"parameters invalid",
    @"3009": @"Priority error",
    @"3010": @"电源模式错误",//add ::0212邮件
    @"4000": @"数字钥匙下发成功",
    @"4001": @"钥匙数量已满",
    @"4002": @"时间同步错误",
    @"4003": @"数据异常",
    @"4004": @"未知原因",
    @"4005": @"电源模式错误",
    @"4006": @"整车电源异常",
    @"4007": @"数字钥匙没有使能",
    @"4008": @"时间超出范围",
    @"4009":@"删除成功",
    @"4010":@"车辆在行驶",
    @"4011":@"车是解锁状态",
    @"4012":@"车窗未关",
    @"4013":@"车辆非禁止状态",
    @"4014":@"请刷新钥匙列表",
    @"4015":@"内部错误",
    @"4016":@"电源模式非normal",
    @"4017":@"电压超出范围",
    @"4018":@"数字钥匙功能禁用",
    @"4019": @"NFC CARD Rejected due to card is locked",
    @"4020": @"NFC CARD Rejected due to card(received failed status from card)",
    @"4021": @"NFC CARD Rejected due to communiation timeout with card",
    @"4022": @"NFC CARD Rejected due to Invalid data received(booking ID does not exist)",
    @"4023": @"NFC CARD Rejected due todata wrote to cardfailed(received status from card)",
    @"4024": @"NFC CARD Rejected due to DigKeyMgr general internal error",
    @"4025": @"NFC CARD Rejected due to CarMod or UsgMod",
    @"4026": @"NFC CARD Rejected due to VBatt",
    @"4027": @"NFC CARD Rejected due to DK Function is Disabled",
    @"4028": @"Please unlock card",
    @"4029": @"Please write card",
    @"4030": @"Please add pass",
    @"4031": @"Please auth applet",
    @"4032": @"NFC Call Nfc failed",
    
    //5系列：add：0212邮件
    @"5002": @"远程控制失败：引擎已经远程启动",//（备注：适用于远程启动类功能）
    @"5003": @"远程控制失败：防盗控制器失败",
    @"5004": @"远程控制失败：复位导致的终止",
    @"5005": @"远程控制失败：车辆处于防盗报警状态",
    @"5006": @"远程控制失败：车载充电器处于连接状态",
    @"5007": @"远程控制失败：非PN档位",
    @"5008": @"远程控制失败：车速无效",
    @"5009": @"远程控制失败：指令错误",
    @"5010": @"远程控制失败：没有找到有效任务",
    @"5011": @"远程控制失败：多指令接收",
    @"5012": @"远程控制失败：切换到正常电源模式",
    @"5013": @"远程控制失败：车辆状态不正确",//（备注：适用于远程控制中非启动类功能，如升降窗）
    @"5014": @"远程控制失败：至少有一门是打开状态",
    @"5015": @"远程控制失败：钥匙在车内",
    @"5016": @"远程控制失败：KL15状态不是OFF",
    @"5017": @"远程控制失败：电压不稳定",
    @"5018": @"远程控制失败：至少有一门没有锁",
    @"5019": @"远程控制失败：至少有一窗没有关闭",
    @"5020": @"远程控制失败：至少有一门没有解锁",
    @"5021": @"远程控制失败：车辆移动中",
    @"5022": @"远程控制失败：刹车踏板被踩下",
    @"5023": @"远程控制失败：车辆处于非设防状态",
    @"5024": @"远程控制失败：一键启动被按下",
    @"5025": @"远程控制失败：远程引擎关闭请求失败",
    @"5026": @"远程控制失败：引擎盖开启",
    @"5027": @"远程控制失败：后备箱开启",
    @"5028": @"远程控制失败：引擎未运行",
    @"5029": @"远程控制失败：远程鉴权失败",
    @"5030": @"SVT业务启动失败",
    @"5031": @"远程查询失败",
    @"5032": @"TEM LOG上传失败",
    @"5033": @"远程启动PM2.5失败",
    @"5034": @"远程诊断失败",
    @"5035": @"远程控制失败：IGN电源输出失败",
    @"5036": @"远程控制失败：Start电源输出失败",
    @"5037": @"OTA升级文件下载失败",
    @"5038": @"OTA升级文件检验失败",
    @"5039": @"OTA升级失败",
    @"5040": @"业务被高优先级抢断而失败。",
    @"5041": @"远程控制失败：PEPS执行出错",
    @"5042": @"远程控制失败：传输错误",
    @"5043": @"远程控制失败：不支持引擎禁止启动功能",
    @"5044": @"远程控制失败：远程控制全功能关闭",
    @"5045": @"远程控制失败：引擎启动次数超限",
    @"5046": @"整车没有结果返回，最终因超时而失败",
    @"5047": @"远程控制失败：Start电源输出超时",
    @"5048": @"远程控制失败：在一次驾驶循环中超过引擎最大启动重试次数",
    @"5049": @"远程控制超时失败",
    @"5050": @"远程控制失败：远程控制子功能关闭",
    @"5051": @"功能未配置/未订阅",
    @"5052": @"置P档失败",
    @"5053": @"EMS鉴权失败",
    @"5054": @"EMS无响应",
    @"5055": @"引擎运行超时",
    @"5056": @"通过CAN的正确指令是无效的",
    @"5057": @"自动驻车不在停止状态",
    @"5058": @"远程控制失败：后备箱开启失败",
    @"5059": @"天窗未关",
    @"5060": @"未插充电枪",
    @"5061": @"外部充电电源故障（未连接或无电）",
    @"5062": @"档位不正确，处于D，R档位",
    @"5063": @"BMS故障",
    @"5064": @"BMS预充电失败",
    @"5065": @"OBC故障",
    @"5066": @"OBC不处于Standby模式",
    @"5067": @"CCP信号异常",
    @"5068": @"小电池电压不在范围内",
    @"5069": @"VCU不允许充电",
    @"5070": @"Hybrid CAN通信异常",
    @"5071": @"服务器下发的日志类型参数为空",
    @"5072": @"远程读取故障功能关",
    @"5073": @"远程升级功能关",
    @"5074": @"电话功能关          ",
    @"5075": @"蓄电池电压低",
    @"5076": @"备用电池电压低",
    @"5077": @"CAN总线关闭",
    @"5078": @"远程控制失败：禁止远程启动发动机已开启",
    @"5079": @"预约充电时间错误",
    @"5080": @"远程控制失败：空调已关闭",
    @"5081": @"远程控制执行失败",
    @"5082": @"远程配置参数：所有参数均无效",
    @"5083": @"远程配置参数：电源管理相关参数无效",
    @"5084": @"服务器下发的消息TTL超时",
    @"5100": @"此功能不支持",
    @"5200": @"车窗打开失败",
    @"5201": @"电子转向柱锁关闭",
    @"5202": @"TBOX处于休眠模式",
    @"5203": @"车辆退出远程控制模式",
    @"5204": @"未检测到充电枪状态",
    @"5205": @"车窗透气失败",
    @"5206": @"蓄电池电压异常",
    @"5207": @"模式已切换",
    @"5208": @"碰撞中",
    @"5209": @"引擎没有停止",
    @"5210": @"车辆防盗报警状态不正确",
    @"5211": @"车辆不在外部锁状态",
    @"5212": @" 油压异常",
    @"5213": @"没有设置智能启动",
    @"5270": @"远程控制失败：蓝牙远程控制进行中",
    @"5271": @"远程控制失败：蓝牙正在查询后备箱是否可关闭",
    @"5272": @"远程控制失败：蓝牙正在进行预点火",
    @"5273": @"远程控制失败：蓝牙正在查询车辆状态",
    @"5274": @"远程启动失败：蓝牙远程控制进行中",
    @"5275": @"远程启动失败：蓝牙正在查询后备箱是否可关闭",
    @"5276": @"远程启动失败：蓝牙正在进行预点火",
    @"5277": @"远程启动失败：蓝牙正在查询车辆状态",
    @"5278": @"电子转向柱锁解锁失败",
    @"5279": @"远程诊断失败：蓝牙远程控制中",
    @"5280": @"远程诊断失败：蓝牙查询后备箱是否可关闭中",
    @"5281": @"远程诊断失败：蓝牙正在进行预打火操作",
    @"5300": @"因数据连接中断无法上传TEM Log",
    @"5301": @"TEM LOG上传起始时间不能大于当前时间",
    @"5302": @"车辆诊断条件不满足",
    @"5303": @"正在执行PM25查询",
    @"5304": @"日志上报时间更新",
    @"5401": @"运行中断",
    @"5402": @"URL地址错误，升级包下载失败",
    @"5403": @"升级包下载超时",
    @"5404": @"超过最大次数，升级包下载失败",
    @"5405": @"空间不足",
    @"5406": @"网络错误",
    @"5407": @"软件更新失败",
    @"5408": @"用户取消升级",
    @"5409": @"升级包无效",
    @"5410": @"远程配置参数：X-CALL相关参数无效",
    @"5411": @"远程配置参数：消息传输相关参数无效",
    @"5412": @"远程配置参数：远程车辆状态相关参数无效",
    @"5413": @"远程配置参数：IP路由表相关参数无效",
    @"5414": @"远程配置参数：防火墙相关参数无效",
    @"5415": @"预约结束时间小于当前时间",
    @"5416": @"charging 预约失败",
    @"5417": @"网络唤醒失败",
    @"5418": @"电池电量低：Energy level=1",
    @"5419": @"响灯鸣笛系统失效",
    @"5420": @"车内carconfig未配置该功能",
    @"5421": @"添加DK失败， 解密失败。",
    @"5422": @"Usage Mode is not correct",
    @"5423": @"TCAM内部出错",
    @"5424": @"私密锁开锁失败",
    @"5425": @"SOC值设置失败",
    @"5426": @"私密锁密码设置失败",
    @"5427": @"when TCAM request AVM image and no image.",
    @"5428": @"VDDM执行超时，无执行反馈信号",
    @"5429": @"charging 激活失败",
    @"5430": @"charging 停止失败",
    @"5431": @"Booking 取消失败",
    @"5432": @"车辆油量低",
    @"5433": @"充电枪连接但没有电",
    @"5434": @"充电枪有电但没激活",
    @"5435": @"放电枪连接但车内没有电",
    @"5436": @"carMode不正确，建议进4S店处理",
    @"5437": @"大数据下发config文件及版本重复",
    @"5438": @"要查询的大数据config文件不存在(保留)",
    @"5439": @"要删除的大数据config文件不存在",
    @"5440": @"增加的大数据config文件存在格式错误",
    @"5441": @"无法播放DVR",
    @"5442": @"无法播放AVM",
    @"5443": @"无法下载文件（DVR）",
    @"5444": @"图像传感器故障（DVR）",
    @"5445": @"SD卡故障（DVR）",
    @"5446": @"无法连接云（DVR）",
    @"5447": @"驻车模式紧急记录（DVR）",
    @"5448": @"未知错误（DVR）",
    @"5449": @"获取AVM图像失败",
    @"5450": @"系统出现异常，无法自动泊车",
    @"5451": @"自动泊车停车条件不满足",
    @"5452": @"自动泊车辆周边环境不安全",
    @"5453": @"自动泊车被用户干预",
    @"5454": @"自动泊车失败",
    @"5455": @"自动泊车服务超时",
    @"5456": @"自动泊车功能不可用",
    @"5457": @"自动泊车失败，请检查车门，后备箱和引擎盖",
    @"5458": @"TCAM所存证书无效",
    @"5459": @"远程控制失败： 有人在车内（ 有DSA连接）",
    @"5460": @"远程控制失败燃油低",
    @"5462": @"远程控制失败，发动机异常",
    @"5463": @"远程控制失败，其他原因",
    @"5464": @"远程启动过程中发动机错误导致的异常熄火",
    @"5465": @"远程启动过程中冷却液低导致异常熄火",
    @"5466": @"远程启动过程中油耗低导致异常熄火",
    @"5467": @"远程启动过程中电池电量低导致异常熄火",
    @"5468": @"远程启动过程中其他原因导致异常熄火",
    @"5469": @"整车功率不足,请确认后重试",
    @"5470": @"整车电量不足,请确认后重试",
    @"5471": @"执行失败，请重试",
    @"5472": @"电池包预热失败",
    @"5473": @"远程配置参数：ser-spec-setting相关参数无效",
    @"5474": @"远程配置参数：logging相关参数无效",
    @"5475": @"远程配置参数：evrms相关参数无效",
    @"5476": @"远程配置参数：upload-url相关参数无效",
    @"5477": @"钥匙激活失败，请重试",
    @"5478": @"钥匙激活失败，请重试",
    @"5479": @"钥匙激活失败，请重试",
    @"5480": @"钥匙激活失败，请重试",
    @"5481": @"钥匙激活失败，请重试",
    @"5482": @"钥匙激活失败，请重试",
    @"5483": @"驶离开高智能驾驶区域，请接管车辆",
    @"5484": @"车辆条件不满足，请接管车辆",
    @"5485": @"系统故障，请接管车辆",
    @"5486": @"环境不满足，请接管车辆",
    @"5487": @"功能干预，请接管车辆",
    @"5488": @"功能超时，请接管车辆",
    
    // 0212邮件里没有
    @"1803" : @"当前车辆暂不支持车分享",
    @"1804" : @"错误的角色类型",
    
    @"16004": @"车辆回复失败",
    // 0212邮件里没有
    @"17001" :@"当前分享状态不支持进行该操作",
    @"17002" :@"当前的车辆有正在进行的分享，暂时无法创建新的分享",
    @"17004" :@"开始取车时间格式错误",
    @"17005" :@"还车时间格式错误",
    @"17006" :@"取车经纬度格式错误",
    @"17007" :@"还车经纬度格式错误",
    @"17008" :@"用户手机号格式错误",
    @"17009" :@"车主手机号格式错误",
    @"17011" :@"自己无法给自己分享车辆",
    @"17012" :@"该分享不存在",
    @"17013" :@"已经给该用户分享了一个权限，不能重复分享",
    @"17014" :@"该车辆同时只能存在10个分享",
    @"17015" :@"车辆远程控制最多只能分享5个",
    @"17016" :@"分享正在创建中...",
    @"17021" :@"当前车辆不支持蓝牙钥匙分享",
    
    @"18000": @"PkiCertCarNotExist",
    @"18001": @"PkiCertAppNotExist",
    @"18002": @"PkiCertCsrError",
    @"18003": @"PkiCertAppNotExist",
    @"19005": @"SecureErrorNFCKeyNotFound",
    @"19006": @"SecureErrorNFCIVNotFound",
    
    
    @"504"   :@"网络不可用",
    /**
     /* start modify by 胡云超 2022.06.20 for DC1E - 262959 +  【地图导航】在电子围栏编辑画面，断网后进行保存时，显示“未知错误”
     **/
    @"-1009"   :@"请检查网络",
    @"1000000001":@"请检查网络"
    /**
     /* end - DC1E - 262959 +  【地图导航】在电子围栏编辑画面，断网后进行保存时，显示“未知错误”
     **/
    };
    
    
    NSMutableDictionary *muDict = [NSMutableDictionary dictionaryWithDictionary:errorDic];
    for (NSString *KeyStr in dict.allKeys) muDict[KeyStr] = dict[KeyStr];
    
    return [muDict.allKeys containsObject: self] ? muDict[self] : (Other ? : @"未知错误");
}
@end
